
//设计循环队列
class MyCircularQueue {
    public int[] array;
    public int front;//头
    public int rear;//尾

    public MyCircularQueue(int k) {
        //多加一个元素，即能够满足存储k个元素，还能多一个出来空着用来处理特殊情况
        array=new int[k+1];
    }

    public boolean enQueue(int value) {
        //判断满，当rear为k时，此时认为是满的，实际上k位置空了出来
        if(isFull()){
            return false;
        }
        array[rear]=value;
        rear=(rear+1)%array.length;
        return true;
    }

    public boolean deQueue() {
        //先进先出,所以是删除头
        if(isEmpty()){
            return false;
        }
        //当移除了一个元素后rear才有可能为0,因为判满的条件是(rear+1)%array.length==front
        front=(front+1)%array.length;
        return true;
    }

    public int Front() {
        if(isEmpty()){
            return -1;
        }
        return array[front];
    }

    public int Rear() {
        if(isEmpty()){
            return -1;
        }
        //所以当rear==0时才有index=array.length-1,因为此时说明已经移除过元素了，front==1，而且变为rear位置为空,array.length-1位置可以存储元素了
        int index=rear==0?array.length-1:rear-1;
        return array[index];
    }

    public boolean isEmpty() {
        //只有rear==front时才是空的，当满的时候front始终在rear的前一个位置
        return rear==front;
    }

    public boolean isFull() {
        return (rear+1)%array.length==front?true:false;
    }
}
